/**
 * Trabalho 2 de Programacao Concorrente.
 * Prof. Dr. Julio Estrella
 * 
 * Determinacao da ocorrencia de palindromos e
 * calculo de numeros primos.
 * 
 * Grupo 07 - Turma B
 * Fabio de Albuquerque Dela Antonio 6792558
 * Leonardo Henrique Omoto 6793160
 * Pedro Paulo Canto Martucci 6793100
 * 
 * primo.c
 */

#include"../include/primo.h"

/* Calcula os numeros primos ate um determinado valor maximo */
int * calcPrimos(int valorMaximo) 
{    
    int i, j, raiz, *vetor;         
    
    /*primeiro passo --> criar um vetor com o tamanho maximo definido (maior numero primo possivel) */
    vetor = (int *)malloc((valorMaximo+1)*sizeof(int));    

    if(vetor == NULL) {
        fprintf(stderr, "Impossivel alocar vetor de numeros primos.\n");
        exit(1);
    }
    
    /*Segundo passo*/    
    raiz = (int)sqrt((double)valorMaximo);     
    
    /*Terceiro passo*/    
    for (i=1; i < valorMaximo; i++) 
        vetor[i] = i;         

    /*Quarto passo*/    
    for (i=2; i < raiz; i++) 
        for (j=i+i; j < valorMaximo; j+=i)             
            vetor[j] = 0; /*removendo da lista*/               
    
    return vetor;
}

/* Acessa vetor de primos (aumenta o vetor se necessario) */
int verificaPrimo(int ** primos, int * primos_tam, int numero) {
    
    int raiz, i, j;
    
    /* Se numero for maior entao realoca vetor de primos, expandindo seu tamanho. */
    if(numero >= (*primos_tam)) {
        (*primos) = (int *)realloc((void *)(*primos), (numero+1001)*sizeof(int));
        
        if(primos == NULL) {
            fprintf(stderr, "Impossivel realocar vetor de numeros primos.\n");
            exit(1);
        }
        
        raiz = (int)sqrt((double)(numero+1001));
        
        for(i = 1; i < numero + 1001; i++)
            (*primos)[i] = i;
        
        for(i = 2; i <= raiz; i++)
            for(j = i+i; j < numero + 1001; j+=i)
                (*primos)[j] = 0;
        
        (*primos_tam) = numero + 1001;
    }
    
    return ((*primos)[numero] == numero);
}

/*imprime os numeros primos*/
void imprimePrimos(int * primos, int primos_tam) {
    int i;
    printf("\nNúmeros primos:\n");
    
    for(i = 0; i < primos_tam; i++)
        if(primos[i] != 0)
            printf("%d ",primos[i]);

    printf("\n");
}
